home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 7 / Amiga Format AFCD07 (Dec 1996, Issue 91).iso / serious / shareware / programming / aros / dos / parsepatternnocase.c < prev    next >
C/C++ Source or Header  |  1996-09-12  |  5KB  |  187 lines

  1. /*
  2.     (C) 1995-96 AROS - The Amiga Replacement OS
  3.     $Id: parsepatternnocase.c,v 1.1 1996/09/11 12:54:46 digulla Exp $
  4.     $Log: parsepatternnocase.c,v $
  5.     Revision 1.1  1996/09/11 12:54:46  digulla
  6.     A couple of new DOS functions from M. Fleischer
  7.  
  8.     Desc:
  9.     Lang: english
  10. */
  11. #include <clib/exec_protos.h>
  12. #include <clib/utility_protos.h>
  13. #include <dos/dos.h>
  14. #include <dos/dosasl.h>
  15. #include "dos_intern.h"
  16.  
  17. /*****************************************************************************
  18.  
  19.     NAME */
  20.     #include <clib/dos_protos.h>
  21.  
  22.     __AROS_LH3(LONG, ParsePatternNoCase,
  23.  
  24. /*  SYNOPSIS */
  25.     __AROS_LHA(STRPTR, Source,      D1),
  26.     __AROS_LHA(STRPTR, Dest,        D2),
  27.     __AROS_LHA(LONG,   DestLength,  D3),
  28.  
  29. /*  LOCATION */
  30.     struct DosLibrary *, DOSBase, 161, Dos)
  31.  
  32. /*  FUNCTION
  33.     Similar to ParsePattern(), only case insensitive (see there
  34.     for more information). For use with MatchPatternNoCase().
  35.  
  36.     INPUTS
  37.  
  38.     RESULT
  39.  
  40.     NOTES
  41.  
  42.     EXAMPLE
  43.  
  44.     BUGS
  45.  
  46.     SEE ALSO
  47.     ParsePattern(), MatchPatternNoCase().
  48.  
  49.     INTERNALS
  50.  
  51.     HISTORY
  52.     29-10-95    digulla automatically created from
  53.                 dos_lib.fd and clib/dos_protos.h
  54.  
  55. *****************************************************************************/
  56. {
  57.     __AROS_FUNC_INIT
  58.     __AROS_BASE_EXT_DECL(struct DosLibrary *,DOSBase)
  59.     STRPTR stack, end;
  60.     UBYTE a, b, t;
  61.     LONG iswild=0;
  62.  
  63.     LONG *result=&((struct Process *)FindTask(NULL))->pr_Result2;
  64. #define ERROR(a) { *result=a; return -1; }
  65.     stack=end=Dest+DestLength;
  66. #define PUT(a) { if(Dest>=stack) ERROR(ERROR_BUFFER_OVERFLOW); *Dest++=(a); }
  67.     
  68.     if(!*Source)
  69.     {
  70.         PUT(0);
  71.         return 0;
  72.     }else
  73.         PUT(MP_OR);
  74.  
  75.     while(*Source)
  76.     {
  77.         switch(*Source++)
  78.         {
  79.             case '#':
  80.                 iswild=1;
  81.                 if(*Source=='?')
  82.                 {
  83.                     Source++;
  84.                     PUT(MP_ALL);
  85.                 }else
  86.                 {
  87.                     PUT(MP_MULT);
  88.                     *--stack=MP_MULT_END;
  89.                     continue;
  90.                 }
  91.                 break;
  92.             case '~':
  93.                 iswild=1;
  94.                 PUT(MP_NOT);
  95.                 *--stack=MP_NOT_END;
  96.                 continue;
  97.             case '?':
  98.                 iswild=1;
  99.                 PUT(MP_SINGLE);
  100.                 break;
  101.             case '(':
  102.                 PUT(MP_OR);
  103.                 *--stack=MP_OR_END;
  104.                 continue;
  105.             case '|':
  106.                 iswild=1;
  107.                 if(stack!=end&&*stack!=MP_OR_END)
  108.                     ERROR(ERROR_BAD_TEMPLATE);
  109.                 PUT(MP_OR_NEXT);
  110.                 break;
  111.             case ')':
  112.                 if(stack==end||*stack!=MP_OR_END)
  113.                     ERROR(ERROR_BAD_TEMPLATE);
  114.                 PUT(*stack++);
  115.                 break;
  116.             case '[':
  117.                 if(*Source=='~')
  118.                 {
  119.                     Source++;
  120.                     PUT(MP_NOT_SET);
  121.                 }else
  122.                     PUT(MP_SET);
  123.                 a=*Source++;
  124.                 if(!a)
  125.                     ERROR(ERROR_BAD_TEMPLATE);
  126.                 do
  127.                 {
  128.                     if(Source[0]=='-'&&Source[1]!=']')
  129.                     {
  130.                         Source++;
  131.                         b=*Source++;
  132.                         if(!b)
  133.                             ERROR(ERROR_BAD_TEMPLATE);
  134.                         if(b>a)
  135.                             t=a, a=b, b=t;
  136.                         PUT(MP_DASH);
  137.                         if(b>=0x81&&b<=0x8e)
  138.                         {
  139.                             PUT(MP_ESCAPE);
  140.                             b-=0x80;
  141.                         }
  142.                         PUT(ToLower(b));
  143.                     }
  144.                     if(a>=0x81&&a<=0x8e)
  145.                     {
  146.                         PUT(MP_ESCAPE);
  147.                         a-=0x80;
  148.                     }
  149.                     PUT(ToLower(a));
  150.                     a=*Source++;
  151.                     if(!a)
  152.                         ERROR(ERROR_BAD_TEMPLATE);
  153.                 }while(a!=']');
  154.                 PUT(MP_SET_END);
  155.                 break;
  156.             case '*':
  157.                 if(DOSBase->dl_Flags&RNF_WILDSTAR)
  158.                 {
  159.                     PUT(MP_ALL);
  160.                 }else
  161.                     PUT('*');
  162.                 break;
  163.             case '\'':
  164.                 if(!*Source++)
  165.                     ERROR(ERROR_BAD_TEMPLATE);
  166.                 /* Fall through */
  167.             default:
  168.                 a=Source[-1];
  169.                 if(a>=0x81&&a<=0x8e)
  170.                 {
  171.                     PUT(MP_ESCAPE);
  172.                     a-=0x80;
  173.                 }
  174.                 PUT(ToLower(a));
  175.                 break;
  176.         }
  177.         while(stack!=end&&*stack!=MP_OR_END)
  178.             PUT(*stack++);
  179.     }
  180.     if(stack!=end)
  181.         ERROR(ERROR_BAD_TEMPLATE);
  182.     PUT(MP_OR_END);
  183.     PUT(0);
  184.     return iswild;
  185.     __AROS_FUNC_EXIT
  186. } /* ParsePatternNoCase */
  187.